<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Hello OpenCV.js</title>
</head>
<body>
<h2>Hello OpenCV.js</h2>
<p id="status">OpenCV.js is loading...</p>
<div>
  <div class="inputoutput">
    <img id="imageSrc" alt="No Image" />
    <div class="caption">imageSrc <input type="file" id="fileInput" name="file" /></div>
  </div>
  <div class="inputoutput">
    <canvas id="canvasOutput" ></canvas>
    <div class="caption">canvasOutput</div>
  </div>
</div>
<script src="./js/opencv7.15.js" type="text/javascript"></script>
<script type="text/javascript">
	let imgElement = document.getElementById('imageSrc');
	let inputElement = document.getElementById('fileInput');
	inputElement.addEventListener('change', (e) => {
	  imgElement.src = URL.createObjectURL(e.target.files[0]);
	}, false);
	imgElement.onload = function() {
		console.log(cv)
	  let mat = cv.imread(imgElement);
	  mat = bilateralFilter(mat, 4, 3);
	  cv.imshow('canvasOutput', mat);
	  mat.delete();
	};
	
	function bilateralFilter(image, value1, value2) {

		let dst = new cv.Mat();
		if (value1 == null || value1 == undefined) value1 = 3; //磨皮系数
		if (value2 == null || value2 == undefined) value2 = 1; //细节系数 0.5 - 2

		var dx = value1 * 5; //双边滤波参数
		var fc = value1 * 12.5; //参数
		var p = 0.1; //透明度

		let temp1 = new cv.Mat(),
			temp2 = new cv.Mat(),
			temp3 = new cv.Mat(),
			temp4 = new cv.Mat();

		cv.cvtColor(image, image, cv.COLOR_RGBA2RGB, 0);

		cv.bilateralFilter(image, temp1, dx, fc, fc); //bilateralFilter(Src)

		let temp22 = new cv.Mat();
		cv.subtract(temp1, image, temp22); //bilateralFilter(Src) - Src

		cv.add(temp22, new cv.Mat(image.rows, image.cols, image.type(), new cv.Scalar(128, 128, 128, 128)), temp2); //bilateralFilter(Src) - Src + 128

		cv.GaussianBlur(temp2, temp3, new cv.Size(2 * value2 - 1, 2 * value2 - 1), 0, 0);
		//2 * GuassBlur(bilateralFilter(Src) - Src + 128) - 1

		let temp44 = new cv.Mat();
		temp3.convertTo(temp44, temp3.type(), 2, -255);
		//2 * GuassBlur(bilateralFilter(Src) - Src + 128) - 256

		cv.add(image, temp44, temp4);
		cv.addWeighted(image, p, temp4, 1 - p, 0.0, dst);
		//Src * (100 - Opacity)

		cv.add(dst, new cv.Mat(image.rows, image.cols, image.type(), new cv.Scalar(10, 10, 10, 0)), dst);
		//(Src * (100 - Opacity) + (Src + 2 * GuassBlur(bilateralFilter(Src) - Src + 128) - 256) * Opacity) /100

		return dst;
	}
	
	function onOpenCvReady() {
	  document.getElementById('status').innerHTML = 'OpenCV.js is ready.';
	
	}
</script>
<script type="text/javascript" src="./js/MathJax.js"></script>

</body>
</html>